(function(window) {
    "use strict";
    
    // 接下来，还需要引进游戏对象 （裁判）
    // 作用： 开始游戏，结束游戏
    // 游戏对象能够管理所有和游戏相关的对象（蛇对象、食物对象、地图）
    // 属性：
    //      蛇对象
    //      食物对象
    //      地图
    // 方法：
    //  开始游戏 :  startGame
    //  结束游戏

    // 创建游戏对象
    // target: 地图元素
    function Game(target) {
        this.food = new Food();
        this.snake = new Snake();
        this.map = target;
    }

    Game.prototype.render = function() {
        // 渲染蛇和食物添加到地图中
        this.snake.render(this.map);
        this.food.render(this.map);
    }

    // 方法
    Game.prototype.startGame = function() {
        // 1. 先渲染蛇和食物到地图中   render
        //   如何去获取到蛇的渲染方法

        // 从游戏对象的实例对象（g）上去获取蛇的实例对象

        var that = this; // this的指向赋值给了变量that

        // this ==> g

        // 2. 在开启定时器，让蛇移动起来
        var timerid = setInterval(function() {
            // 定时器中的this指向window
            // 坑： this的问题
            // this.snake.move(this.map);

            // 获取外面的this即可，通过that变量
            that.snake.move(that.map, that.food);


            // 蛇撞墙的逻辑：
            //  判断啥： 判断蛇头的坐标和四面墙的关系
            var head = that.snake.body[0]; // 蛇头的坐标

            if (
                head.x < 0 ||
                head.x >= that.map.offsetWidth / that.snake.width ||
                head.y < 0 ||
                head.y >= that.map.offsetHeight / that.snake.height
            ) {
                alert("Game Over");
                clearInterval(timerid);
            }

            // 蛇吃到了自己
            //  判断啥：蛇头的坐标和蛇身体的坐标是否有重合的
            //  遍历蛇身体的每一节坐标和蛇头的坐标

            // i = 1 开始，因为遍历的是蛇身体，排除掉蛇头
            // 优化： i = 4开始，少了几次for循环
            for (var i = 4; i < that.snake.body.length; i++) {
                // that.snake.body[0] ==> 蛇头

                // that.snake.body[i] ==> 蛇的每一节身体
                // console.log(that.snake.body[i]);

                var item = that.snake.body[i];

                if (head.x == item.x && head.y == item.y) {
                    alert("Game Over");
                    clearInterval(timerid);
                }
            }
        }, 100)


        // 给页面注册keyup键盘事件
        document.onkeyup = function(e) {
            // console.log(this);  // document

            var key = e.keyCode;

            if (key == 37) {
                // 左
                // 坑： this的问题
                // this.snake.direction = "left";

                // 如果希望蛇移动方向朝左，那么蛇现在的移动方向不能为右
                // 如果为右，按键无效
                if (that.snake.direction == "right") {
                    return;
                }

                that.snake.direction = "left";
            } else if (key == 38) {
                // 上

                if (that.snake.direction == "down") {
                    return;
                }

                that.snake.direction = "up";
            } else if (key == 39) {
                // 右
                if (that.snake.direction == "left") {
                    return;
                }

                that.snake.direction = "right";
            } else if (key == 40) {
                // 下
                if (that.snake.direction == "up") {
                    return;
                }
                that.snake.direction = "down";
            }
        }
    }


    window.Game = Game;

})(window)
